package hudson.plugins.rubymetricfu; import hudson.model.Build; import hudson.model.BuildListener; import hudson.model.Result; import hudson.tasks.Publisher; import hudson.FilePath; import hudson.Launcher; import hudson.model.Action; import hudson.model.Build; import hudson.model.BuildListener; import hudson.model.Descriptor; import hudson.model.Project; import hudson.model.StreamBuildListener; import hudson.model.Result; import hudson.plugins.rake.Rake; import hudson.plugins.rake.RubyInstallation; import hudson.plugins.rubymetricfu.MetricFuParser; import hudson.plugins.rubymetricfu.model.MetricFuResults; import hudson.tasks.Publisher; import java.io.File; import java.io.IOException; import org.codehaus.plexus.util.StringOutputStream; import org.kohsuke.stapler.DataBoundConstructor; public class RubyMetricsPublisher extends Publisher { private final Rake rake; private final String rakeInstallation; public static final DescriptorImpl DESCRIPTOR = new DescriptorImpl(); @DataBoundConstructor public RubyMetricsPublisher(String rakeInstallation) { this.rakeInstallation = rakeInstallation; this.rake = new Rake(this.rakeInstallation, null, "metrics:all", null, null, true); } public boolean perform(Build<?, ?> build, Launcher launcher, BuildListener listener) throws InterruptedException, IOException { copyMetricsToBuildDir(build); listener.getLogger().println("Publishing MetricFu stats..."); if (build.getResult() == Result.FAILURE) { return false; } BuildListener stringListener = new StreamBuildListener(new StringOutputStream()); if (rake.perform(build, launcher, stringListener)) { MetricFuResults results = parserBuildMetrics(build); RubyMetricsBuildAction action = new RubyMetricsBuildAction(build, results); build.getActions().add(action); } return true; } private MetricFuResults parserBuildMetrics(Build<?, ?> build){ MetricFuParser parser = new MetricFuParser(reportFile(build)); MetricFuResults results = parser.parse(); return results; } private File reportFile(Build<?, ?> build){ File rootDir = build.getRootDir(); File yml = new File(rootDir, "report.yml"); return yml; } private void copyMetricsToBuildDir(Build<?, ?> build) throws IOException, InterruptedException{ final Project<?, ?> project = build.getParent(); final FilePath workspace = project.getModuleRoot(); final FilePath metricfuReports = workspace.child("tmp/metric_fu/"); metricfuReports.copyRecursiveTo("**/*", new FilePath(build.getRootDir())); } protected boolean fail(Build<?, ?> build, BuildListener listener, String message) { listener.getLogger().println(message); build.setResult(Result.FAILURE); return true; } public String getRakeInstallation() { return rakeInstallation; } public Action getProjectAction(Project project) { return new RubyMetricsProjectAction(project); } public static final class DescriptorImpl extends Descriptor<Publisher> { protected DescriptorImpl() { super(RubyMetricsPublisher.class); } @Override public String getHelpFile() { return "/plugin/rubymetricfu/rubyMetricFuHelp.html"; } @Override public String getDisplayName() { return "Ruby Metric-fu reports"; } public RubyInstallation[] getRakeInstallations() { return Rake.DESCRIPTOR.getInstallations(); } } public Descriptor<Publisher> getDescriptor() { return DESCRIPTOR; } }